package com.azzaou.controller;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import com.azzaou.model.Associe;
import com.azzaou.model.Client;
import com.azzaou.model.Fournisseur;
import com.azzaou.model.PaiementFournisseur;
import com.azzaou.model.TypePaiement;
import com.azzaou.service.IAssocieService;
import com.azzaou.service.IFournisseurService;
import com.azzaou.util.ErrorHandler;
import com.azzaou.util.ExportUtil;

public class FournisseurController implements Serializable {

	private static final long serialVersionUID = 1L;
	Fournisseur fournisseur;
	TypePaiement typePaiement;
	List<TypePaiement> listTypePaiement;
	PaiementFournisseur paiementFrs ;
	IFournisseurService fournisseurService;
	IAssocieService associeService;
	ErrorHandler errorHandler;
	private Associe associe;
    private List<Fournisseur> listFournisseurs;
    private List<PaiementFournisseur> listPaiements;
    private List<SelectItem> listNomComplet;
   
    private List<SelectItem> listCateg;
    private List<SelectItem> listTypePaie;
    private List<SelectItem> listAssocie;
	private ExternalContext context ;
	private HttpServletRequest request;
	String action = "";
	String idCategorie;
	private Long idAssocie;
	private Long idPaiement;
	boolean delete = false;
	private Double dejaPaye;
	private Double duAuFournisseur;
	private Double aPayer;
	
	

	public Long getIdAssocie() {
		return idAssocie;
	}

	public void setIdAssocie(Long idAssocie) {
		this.idAssocie = idAssocie;
	}

	public Long getIdPaiement() {
		return idPaiement;
	}

	public void setIdPaiement(Long idPaiement) {
		this.idPaiement = idPaiement;
	}

	public Associe getAssocie() {
		return associe;
	}

	public void setAssocie(Associe associe) {
		this.associe = associe;
	}

	public IAssocieService getAssocieService() {
		return associeService;
	}

	public void setAssocieService(IAssocieService associeService) {
		this.associeService = associeService;
	}

	public Double getDejaPaye() {
		dejaPaye = fournisseurService.getDejaPaye(fournisseur);
		if(dejaPaye ==null)
		{
			dejaPaye = (double) 0;
		}
		return dejaPaye;
	}

	public void setDejaPaye(Double dejaPaye) {
		this.dejaPaye = dejaPaye;
	}

	public Double getDuAuFournisseur() {
		duAuFournisseur = fournisseurService.getDuAuFournisseur(fournisseur);
		if(duAuFournisseur ==null)
		{
			duAuFournisseur = (double) 0;
		}
		return duAuFournisseur;
	}

	public void setDuAuFournisseur(Double duAuFournisseur) {
		this.duAuFournisseur = duAuFournisseur;
	}

	public Double getaPayer() {
		aPayer = new Double(0);
		aPayer = getDuAuFournisseur() - getDejaPaye();
		if(aPayer ==null)
		{
			aPayer = (double) 0;
		}
		return aPayer;
	}

	public void setaPayer(Double aPayer) {
		this.aPayer = aPayer;
	}

	public boolean isDelete() {
		return delete;
	}

	public void setDelete(boolean delete) {
		this.delete = delete;
	}

	public TypePaiement getTypePaiement() {
		return typePaiement;
	}

	public void setTypePaiement(TypePaiement typePaiement) {
		this.typePaiement = typePaiement;
	}

	public String filter()
	{
		listFournisseurs = fournisseurService.getFournisseurByCriteria(fournisseur);
		action = "filter";
		return "";
	}
	
	public String filterType()
	{
		listTypePaiement = fournisseurService.getTypeByCriteria(typePaiement);
		action = "filter";
		return"";
	}
	
	public String goToDeleteFournisseur() {
		context= FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest)context.getRequest();
		try {
			fournisseurService.remove(fournisseur);
			listFournisseurs = fournisseurService.getAllActifFournisseur();
			action = "add";
			context.redirect(request.getContextPath()
					+ "/pages/fournisseurs.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
		delete = false;
		fournisseur = new Fournisseur();
		return "";
	}
	
	public String Payer()
	{
		context= FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest)context.getRequest();
		try {
			//fournisseurService.remove(fournisseur);
			//listFournisseurs = fournisseurService.getAllActifFournisseur();
			paiementFrs.setFournisseur(fournisseur);
			paiementFrs.setTypePaiement(fournisseurService.gettypePaiementById(idPaiement));
			paiementFrs.setAssocie(associeService.getAssocieById(idAssocie));
			fournisseurService.saveOrUpdatePaie(paiementFrs);
			action = "add";
			context.redirect(request.getContextPath()
					+ "/pages/payerFournisseur.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
		delete = false;
		paiementFrs = new PaiementFournisseur();
		return "";
	}
	
	public String goToDeleteTypePaiement() {
		context= FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest)context.getRequest();
		try {
			fournisseurService.removeT(typePaiement);
			listTypePaiement = fournisseurService.getAllTypePaiement();
			action = "add";
			context.redirect(request.getContextPath()
					+ "/pages/typePaiements.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
		typePaiement = new TypePaiement();
		return "";
	}
	
	
	
	public String saveOrUpdateTypePaiement()
	{
		context= FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest)context.getRequest();
		try {
		//	fournisseur.getPaiementFournisseur().addAll(listPaiements);
			fournisseurService.saveOrUpdateT(typePaiement);
			listTypePaiement = fournisseurService.getAllTypePaiement();
			action = "add";
			context.redirect(request.getContextPath()
					+ "/pages/typePaiements.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
		fournisseur = new Fournisseur();
		return "";
	}	
	
	public String saveOrUpdateFournisseur()
	{
		context= FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest)context.getRequest();
		try {
		//	fournisseur.getPaiementFournisseur().addAll(listPaiements);
			fournisseurService.saveOrUpdate(fournisseur);
			listFournisseurs = fournisseurService.getAllActifFournisseur();
			action = "add";
			context.redirect(request.getContextPath()
					+ "/pages/fournisseurs.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
		fournisseur = new Fournisseur();
		return "";
	}	
	
//	public void addPaiement(){
//		if(listPaiements==null)
//		{
//			listPaiements = new HashSet<>();
//		}
//		listPaiements.add(paiementFrs);
//		paiementFrs = new PaiementFournisseur();
//	}
	public String goToAddFournisseur()
	{
		fournisseur = new Fournisseur();
		//chantier.setStatut("C"); 
		context= FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest)context.getRequest();
		try {
			context.redirect(request.getContextPath()
			           + "/pages/fournisseur.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "";
	}
	
	public String goToAddTypePaiement()
	{
		typePaiement = new TypePaiement();
		//chantier.setStatut("C"); 
		context= FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest)context.getRequest();
		try {
			context.redirect(request.getContextPath()
			           + "/pages/typePaiement.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "";
	}
	
	public String goToUpdateFournisseur()
	{
		context= FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest)context.getRequest();
		try {
			context.redirect(request.getContextPath()
					+ "/pages/fournisseur.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "";
	}
	
	
	public String goToUpdateTypePaiement()
	{
		context= FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest)context.getRequest();
		try {
			context.redirect(request.getContextPath()
					+ "/pages/typePaiement.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "";
	}
	
	public String goToPaiements()
	{
		paiementFrs = new PaiementFournisseur();
		context= FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest)context.getRequest();
		//listPaiements = fournisseurService.getListPaiements(fournisseur);
		
		
		try {
			context.redirect(request.getContextPath()
					+ "/pages/payerFournisseur.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "";
		
	}
	public String retourAuFournisseur()
	{
		
		context = FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest)context.getRequest();
		listFournisseurs = fournisseurService.getAllActifFournisseur();
		try {
			context.redirect(request.getContextPath()
					+ "/pages/fournisseurs.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
		fournisseur = new Fournisseur();
		return "";
	}
	
	
	
	public String retourATypePaiement()
	{
		
		context = FacesContext.getCurrentInstance().getExternalContext();
		request = (HttpServletRequest)context.getRequest();
		listTypePaiement = fournisseurService.getAllTypePaiement();
		try {
			context.redirect(request.getContextPath()
					+ "/pages/typePaiements.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
		typePaiement = new TypePaiement();
		return "";
	}
	

	public void exportResults() {
		try {
			DateFormat dateFormatCell = new SimpleDateFormat("dd/MM/yyyy");
			DateFormat dateFormat = new SimpleDateFormat("ddMMyyyy");
			String date = dateFormat.format(new Date());
			
			String fileBaseName = "fournisseur_" + date;
			String filePath = fileBaseName + ".xls";
			int i = 1;
			HSSFWorkbook hwb = new HSSFWorkbook();
			HSSFSheet sheet = hwb.createSheet(fileBaseName);

			HSSFRow rowhead = sheet.createRow((short) 0);
			rowhead.createCell((short) 0).setCellValue("#id");
			rowhead.createCell((short) 1).setCellValue("Nom");
			rowhead.createCell((short) 2).setCellValue("Prenom");
			rowhead.createCell((short) 3).setCellValue("Email");
			rowhead.createCell((short) 4).setCellValue("Mobile");
			rowhead.createCell((short) 5).setCellValue("Telephone fixe");
			rowhead.createCell((short) 6).setCellValue("Ville");
			rowhead.createCell((short) 7).setCellValue("Adresse");
			

			for (Fournisseur clt : listFournisseurs) {
				HSSFRow row = sheet.createRow((short) i);
				if (clt.getId() != null) {
					row.createCell((short) 0).setCellValue(clt.getId());
				} else {
					row.createCell((short) 0).setCellValue("");
				}
				row.createCell((short) 1).setCellValue(
						ExportUtil.getCellValue(clt.getNom()));
				row.createCell((short) 2).setCellValue(
							ExportUtil.getCellValue(clt.getPrenom()));
				row.createCell((short) 3).setCellValue(
						ExportUtil.getCellValue(clt.getEmail()));
				row.createCell((short) 4)
							.setCellValue(ExportUtil.getCellValue(clt.getmobile()));
				row.createCell((short) 5).setCellValue(
							clt.getTelephone());
				row.createCell((short) 6).setCellValue(
						ExportUtil.getCellValue(clt.getVille()));
				row.createCell((short) 7).setCellValue(
						ExportUtil.getCellValue(clt.getAdresse()));
				i++;
			}

			FileOutputStream fileOut = new FileOutputStream(filePath);
			hwb.write(fileOut);
			fileOut.close();

			ExportUtil.prepareDownload(filePath);
		} catch (Exception ex) {
			ex.fillInStackTrace();
		}
	}

	
	public List<SelectItem> getListTypePaie() {
		listTypePaie = new ArrayList<SelectItem>();
		for(TypePaiement value :  fournisseurService.getAllTypePaiement())
		{
			listTypePaie.add(new SelectItem(value.getId(), value.getLibelle()));
		}
		return listTypePaie;
	}

	public void setListTypePaie(List<SelectItem> listTypePaie) {
		this.listTypePaie = listTypePaie;
	}

	public List<SelectItem> getListAssocie() {
		listAssocie = new ArrayList<SelectItem>();
	List<Associe> associes = associeService.getAllActifAssocie();
		for(Associe value :  associeService.getAllActifAssocie())
		{
			listAssocie.add(new SelectItem(value.getId(), value.getNom() + " " + value.getPrenom()));
		}
		return listAssocie;
	}

	public void setListAssocie(List<SelectItem> listAssocie) {
		this.listAssocie = listAssocie;
	}

	public List<SelectItem> getListNomComplet() {
		listNomComplet = new ArrayList<SelectItem>();
		for(Fournisseur value :  fournisseurService.getAllActifFournisseur())
		{
			listNomComplet.add(new SelectItem(value, value.getNom()));
		}
		return listNomComplet;
	}
	
	public List<SelectItem> getListCateg() {
		listCateg = new ArrayList<SelectItem>();
		listCateg.add(new SelectItem("C", "Cheque"));
		listCateg.add(new SelectItem("E", "Espece"));
		listCateg.add(new SelectItem("V", "Virement"));
		return listCateg;
	}

	public void setListNomComplet(List<SelectItem> listNomComplet) {
		this.listNomComplet = listNomComplet;
	}

	public List<Fournisseur> getListFournisseurs() {
		return listFournisseurs;
	}

	public void setListFournisseurs(List<Fournisseur> listFournisseurs) {
		this.listFournisseurs = listFournisseurs;
	}

	public Fournisseur getFournisseur() {
		return fournisseur;
	}
	public void setFournisseur(Fournisseur fournisseur) {
		this.fournisseur = fournisseur;
	}
	public IFournisseurService getFournisseurService() {
		return fournisseurService;
	}
	public void setFournisseurService(IFournisseurService fournisseurService) {
		this.fournisseurService = fournisseurService;
	}
	public ErrorHandler getErrorHandler() {
		return errorHandler;
	}
	public void setErrorHandler(ErrorHandler errorHandler) {
		this.errorHandler = errorHandler;
	}

	public PaiementFournisseur getPaiementFrs() {
		return paiementFrs;
	}

	public void setPaiementFrs(PaiementFournisseur paiementFrs) {
		this.paiementFrs = paiementFrs;
	}

	public List<PaiementFournisseur> getListPaiements() {
		return listPaiements;
	}

	public void setListPaiements(List<PaiementFournisseur> listPaiements) {
		this.listPaiements = listPaiements;
	}

	public String getIdCategorie() {
		return idCategorie;
	}

	public void setIdCategorie(String idCategorie) {
		this.idCategorie = idCategorie;
	}

	public List<TypePaiement> getListTypePaiement() {
		return listTypePaiement;
	}

	public void setListTypePaiement(List<TypePaiement> listTypePaiement) {
		this.listTypePaiement = listTypePaiement;
	}
	
	
	
}
